This exercise will introduce digital elevation models, downloading data from a Federal Emergency Management Agency ArcGIS Viewer, and create derive topographic datasets.

1 The Introduction

Middle Tennessee has a history of significant weather events including more than two dozen major flooding events over the past 100yrs. Several precipitation events over the past decade have caused devastating flooding in Cheatman, Davidson, Humphreys, and Montgomery counties. These floods alone cost Tennessee more than $2.5 billion dollars and resulted in the loss of more than 50 lives.

A recent analysis of the historic 2019 floods in the midwest estimated more than 1.1 million acres of agricultural fields were flooded costing the US more than $3 billion dollars. This combined with the most recent economic outlook for rural communities in the 4th National Climate Assessment report suggest an increase in economic vulnerabilities in the agricultural sectors of the Southeast. Based on your recent work for FEMA (Exercise 4) and MCEMA (Exercise 2), they recommended that the Tennessee Emergency Management Agency and Tennessee Department of Agriculture hire you to help analyze the impact of flooding on croplands in Montgomery County.

In this exercise you will:

  • Download hazard data from FEMA
  • Develop topographically derived datasets from raster data
  • Calculate geometric extend of vector data
  • Create graphs of attribute information

Software specific directions can be found for each step below. Please submit the answer to the questions and your final map by the due date.

1.1 Step One: The Data

The data you will be using for this exercise comes from the FEMA National Flood Hazard Layer digital viewer and is compiled from various sources including the Flood Rate Insurance Map (FIRM) which is the source of some flood-related definitions in this exercise.

View Directions in ArcGIS Pro

To begin, open a new browser window/tab and go to the FEMA NFHL digital viewer. On the welcome page you will be greeted with a warning window. Click OK and then zoom into campus.

NFHL Homepage

When you are able to see campus at the same zoom level as in the image below, click on the image and you will see a pop-up box with options to download the information

NFHL Download

Click on the Download county GIS data link and save the file in your project folder for this exercise. Unzip the compressed folder and view the information within the Catalog Pane. You should now see a number of possible shapefiles in the unzipped folder. The one you need to add to your map is S_FLD_HAZ_AR.shp.

Hazard Data in Catalog Pane

Examining the attribute table for the dataset you will see a number of different variables; some of them without data or with a value of -9999 which is used by a number of different data formats to mean no data. The two variables you will use for this exercise is the FLD_ZONE and ZONE_SUBTY. Notice that the FLD_ZONE field is populated with “X”, “A”, and “AE” values while the ZONE_SUBTY has three values “0.2 PCT Annual Chance Flood Hazard”, “Area of Minimal Flood Hazard”, and “Floodway”. The following is a brief description of each:

  • A: a high-risk flood zone that has a one percent chance of flooding each year. Over the course of a 30-year mortgage, the likelihood of a flood is 26 percent. There are no detailed analyses of areas in Flood Zone A, so there are no depths or base flood elevations in this zone.
  • AE: a high-risk flood zone that present a one percent annual chance of flooding and a 26% chance over the life of a 30-year mortgage. These regions are clearly defined in Flood Insurance Rate Maps and are paired with detailed information about base flood elevations.
  • X: area determined to be outside the 500-year flood and protected by levee from 100- year flood.
  • 0.2 PCT Annual Chance Flood Hazard: area with a moderate chance of flood equal to 0.2 percent annually.
  • Area of Minimal Flood Hazard: area determined to be outside the 500-year flood and protected by levee from 100- year flood.
  • Floodway: the channel of a river or other watercourse and the adjacent land areas that must be reserved in order to discharge the base flood without cumulatively increasing the water surface elevation more than a designated height.

For this analysis you will focus on A, AE, and 0.2 PCT Annual Chance Flood Hazard zones. While there are a number of ways to subset the data, in this exercise you will simply right-click on the dataset and select Data > Export Features. In the resulting window select the flood hazard data as the Input Feature, use the browse button to select the output location in your project folder, and give the *.shp file a new name. Next, click the new expression button and use the following SQL:

Where FLD_ZONE is equal to A

Then click Add Clause…

Or Where FLD_ZONE is equal to AE

Then click Add Clause…

Or Where ZONE_SUBTY is equal to 0.2 PCT Annual Chance Flood Hazard

And finally click OK. This will create a new dataset that includes only the selected variables.

Selecting only the flood zone information from above

Next, open a new tab in your browser to download the remaining data for this exercise from the exercise GitHub Page. The montco_dem_feet.tif is the digital elevation model that will be used to calculate contours and the montco_crop_land zip contains a shapefile of selected cropland data for Montgomery County from the USDA National Agriculture Statistics Service CropScape Website. With this data downloaded to your project folder, add them to your map view. On the example below the names and symbology for the flood zones were changed to reflect their category description.

Data Example

Question No. 1
What is the range of values for the DEM of Montgomery County?

View directions in QGIS

To begin, open a new browser window/tab and go to the FEMA NFHL digital viewer. On the welcome page you will be greeted with a warning window. Click OK and then zoom into campus.

NFHL Homepage

When you are able to see campus at the same zoom level as in the image below, click on the image and you will see a pop-up box with options to download the information

NFHL Download

Click on the Download county GIS data link and save the file in your project folder for this exercise. Unzip the compressed folder and view the information within the Catalog Pane. You should now see a number of possible shapefiles in the unzipped folder. The one you need to add to your map is S_FLD_HAZ_AR.shp.

Hazard Data in Catalog Pane

Examining the attribute table for the dataset you will see a number of different variables; some of them without data or with a value of -9999 which is used by a number of different data formats to mean no data. The two variables you will use for this exercise is the FLD_ZONE and ZONE_SUBTY. Notice that the FLD_ZONE field is populated with “X”, “A”, and “AE” values while the ZONE_SUBTY has three values “0.2 PCT Annual Chance Flood Hazard”, “Area of Minimal Flood Hazard”, and “Floodway”. The following is a brief description of each:

  • A: a high-risk flood zone that has a one percent chance of flooding each year. Over the course of a 30-year mortgage, the likelihood of a flood is 26 percent. There are no detailed analyses of areas in Flood Zone A, so there are no depths or base flood elevations in this zone.
  • AE: a high-risk flood zone that present a one percent annual chance of flooding and a 26% chance over the life of a 30-year mortgage. These regions are clearly defined in Flood Insurance Rate Maps and are paired with detailed information about base flood elevations.
  • X: area determined to be outside the 500-year flood and protected by levee from 100- year flood.
  • 0.2 PCT Annual Chance Flood Hazard: area with a moderate chance of flood equal to 0.2 percent annually.
  • Area of Minimal Flood Hazard: area determined to be outside the 500-year flood and protected by levee from 100- year flood.
  • Floodway: the channel of a river or other watercourse and the adjacent land areas that must be reserved in order to discharge the base flood without cumulatively increasing the water surface elevation more than a designated height.

For this analysis you will focus on A, AE, and 0.2 PCT Annual Chance Flood Hazard zones.

Question No. 1
What is the range of values for the DEM of Montgomery County?

View directions in R

Before you begin, you will need to open the Ex2 Colab Notebook and insert tocolab after github in the URL to open in the Colab Environment. As you have seen before, R requires various packages to complete certain analyses. In this exercise you will be using tidyverse, OpenStreetMaps, ggfortify, maptools, and rgeos. To install and load the packages we will use the following script:

Blah…blah…blah…

Question No. 1
What is the range of values for the DEM of Montgomery County?

1.2 Step Two: The Analyses

In order to determine the elevations that are most susceptible to flooding you will need to create contours from the DEM.

View Directions in ArcGIS Pro

By either searching through the tools drop-down menu or by searching for it in the Geoprocessing Tools, open the Contour tool, provide the following parameters, and click Run:

  • Input raster = montco_dem_feet.tif
  • Output feature class = navigate to your project folder and save as a shapefile (*.shp)
  • Countour interval = 20
  • Base contour = 100
  • Z factor = 1
  • Contour type = Contour
  • Maximum verticies per feature = leave blank

NFHL Download

You will now have contours added to your map view. The contours will encompass the entire county because they were created from the county DEM.

NFHL Download

While this information could be beneficial for other analyses, for this exercise you should clip the contour based on the flood zone dataset you created in Step 1. This will create a new dataset that includes only the elevations prone to flooding issues.

Finally, because this exercise focuses on croplands that are susceptible to flooding, clip the cropland dataset to the select flood zones layer as well. Then you can use the symbology tool to give the data unique values by class_name.

Data Example

Question No. 2
What is the range of elevations in flood prone areas?

View Directions in QGIS

Blah…blah…blah…

Question No. 2
Insert Text Here

View Directions in R

Blah…blah…blah…

Question No. 2
Insert Text Here

1.3 Step Three: The Visualization

In this step you will create landscape views that mimic three dimensional surfaces and provide a custom color palette for the croplands based on data from the State of Tennessee, Department of Agriculture.

View directions in ArcGIS Pro

Blah…blah…blah…

HILLSHADE

CropScape color

Question No. 3
Insert Text Here

View directions in QGIS

Blah…blah…blah…

Question No. 3
Insert Text Here

View directions in R

Blah…blah…blah…

Question No. 3
Insert Text Here

1.4 Step Four: The Proposal

Blah…blah…blah…

View directions in ArcGIS Pro

Blah…blah…blah…

Question No. 4
Insert Text Here

View directions in QGIS

Blah…blah…blah…

Question No. 4
Insert Text Here

View directions in R

Blah…blah…blah…

Question No. 4
Insert Text Here

2 The Write-Up

When completing the report for FEMA please provide the following information:

  • Describe the elevation range that crops are most impacted by flood waters in Montgomery County.
  • What are the top five (5) crops most impacted by flood waters by area and what are the individual areas covered by these crops?
  • Of the grain crops in the question above that are listed here, what would be the financial loss if all those crops were lost to flood?
    • Assuming 170 bushels per acre of corn and 50 bushels per acre for other grains.

When complete, send a link to your Colab Notebook or word document with answers to Questions 1-4 and your completed map via email.

LS0tDQp0aXRsZTogIkV4ZXJjaXNlIDg6IERpZ2l0YWwgRWxldmF0aW9uIE1vZGVscyA8YnI+PHNtYWxsPkdlb2dyYXBoaWMgSW5mb3JtYXRpb24gU3lzdGVtcyAxIExhYjwvc21hbGw+PC9icj4iDQphdXRob3I6ICJHRU9HIDMxNTAiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgcm93cy5wcmludDogMTANCiAgICB0aGVtZTogY29zbW8NCiAgICBoaWdobGlnaHQ6IGJyZWV6ZWRhcmsNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiBubw0KICAgICAgc21vb3RoX3Njcm9sbDogeWVzDQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQplZGl0b3Jfb3B0aW9uczoNCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQ0KICBtb2RlOiBnZm0NCi0tLQ0KDQpgYGB7PWh0bWx9DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KDQpoMS50aXRsZSB7DQogIGZvbnQtc2l6ZTogNDBweDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDIwcHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KYm9keSB7DQogIGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2E7DQogIGZvbnQtc2l6ZTogMTJwdDsNCn0NCg0KLnpvb20gew0KICB0cmFuc2Zvcm0tb3JpZ2luOiA0MCUgNTAlIDA7DQogIHRyYW5zaXRpb246IHRyYW5zZm9ybSAuMnM7DQogIG1hcmdpbjogMCBhdXRvOw0KfQ0KLnpvb20gaW1new0KCXdpZHRoOmF1dG87DQoJaGVpZ2h0OmF1dG87CQ0KfQ0KLnpvb206aG92ZXIgew0KICB0cmFuc2Zvcm06IHNjYWxlKDIpOw0KfQ0KDQp0aCwgdGQge3BhZGRpbmc6IDVweDt9DQoNCjwvc3R5bGU+DQoNCmBgYA0KPGhyPjwvaHI+DQoNClRoaXMgZXhlcmNpc2Ugd2lsbCBpbnRyb2R1Y2UgZGlnaXRhbCBlbGV2YXRpb24gbW9kZWxzLCBkb3dubG9hZGluZyBkYXRhIGZyb20gYSBbRmVkZXJhbCBFbWVyZ2VuY3kgTWFuYWdlbWVudCBBZ2VuY3ldKGh0dHBzOi8vd3d3LmZlbWEuZ292LykgQXJjR0lTIFZpZXdlciwgYW5kIGNyZWF0ZSBkZXJpdmUgdG9wb2dyYXBoaWMgZGF0YXNldHMuDQoNCiMgVGhlIEludHJvZHVjdGlvbg0KDQpNaWRkbGUgVGVubmVzc2VlIGhhcyBhIGhpc3Rvcnkgb2YgW3NpZ25pZmljYW50IHdlYXRoZXIgZXZlbnRzXShodHRwczovL3d3dy53ZWF0aGVyLmdvdi9vaHgvY2FsZW5kYXIpIGluY2x1ZGluZyBtb3JlIHRoYW4gdHdvIGRvemVuIG1ham9yIGZsb29kaW5nIGV2ZW50cyBvdmVyIHRoZSBwYXN0IDEwMHlycy4gU2V2ZXJhbCBwcmVjaXBpdGF0aW9uIGV2ZW50cyBvdmVyIHRoZSBwYXN0IGRlY2FkZSBoYXZlIGNhdXNlZCBkZXZhc3RhdGluZyBmbG9vZGluZyBpbiBDaGVhdG1hbiwgRGF2aWRzb24sIEh1bXBocmV5cywgYW5kIE1vbnRnb21lcnkgY291bnRpZXMuIFRoZXNlIGZsb29kcyBhbG9uZSBjb3N0IFRlbm5lc3NlZSBtb3JlIHRoYW4gJDIuNSBiaWxsaW9uIGRvbGxhcnMgYW5kIHJlc3VsdGVkIGluIHRoZSBsb3NzIG9mIG1vcmUgdGhhbiA1MCBsaXZlcy4gDQoNCkEgcmVjZW50IGFuYWx5c2lzIG9mIHRoZSBoaXN0b3JpYyAyMDE5IGZsb29kcyBpbiB0aGUgbWlkd2VzdCBlc3RpbWF0ZWQgbW9yZSB0aGFuIDEuMSBtaWxsaW9uIGFjcmVzIG9mIGFncmljdWx0dXJhbCBmaWVsZHMgd2VyZSBmbG9vZGVkIGNvc3RpbmcgdGhlIFVTIG1vcmUgdGhhbiAkMyBiaWxsaW9uIGRvbGxhcnMuIFRoaXMgY29tYmluZWQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZWNvbm9taWMgb3V0bG9vayBmb3IgcnVyYWwgY29tbXVuaXRpZXMgaW4gdGhlIDR0aCBOYXRpb25hbCBDbGltYXRlIEFzc2Vzc21lbnQgW3JlcG9ydF0oaHR0cHM6Ly9uY2EyMDE4Lmdsb2JhbGNoYW5nZS5nb3YvY2hhcHRlci8xOSNrZXktbWVzc2FnZS00KSBzdWdnZXN0IGFuIGluY3JlYXNlIGluIGVjb25vbWljIHZ1bG5lcmFiaWxpdGllcyBpbiB0aGUgYWdyaWN1bHR1cmFsIHNlY3RvcnMgb2YgdGhlIFNvdXRoZWFzdC4gQmFzZWQgb24geW91ciByZWNlbnQgd29yayBmb3IgRkVNQSAoW0V4ZXJjaXNlIDRdKGh0dHBzOi8vY2hyaXNtZ2VudHJ5LmdpdGh1Yi5pby9HSVMxLUV4ZXJjaXNlLTQvKSkgYW5kIE1DRU1BIChbRXhlcmNpc2UgMl0oaHR0cHM6Ly9jaHJpc21nZW50cnkuZ2l0aHViLmlvL0dJUzEtRXhlcmNpc2UtMi8pKSwgdGhleSByZWNvbW1lbmRlZCB0aGF0IHRoZSBbVGVubmVzc2VlIEVtZXJnZW5jeSBNYW5hZ2VtZW50IEFnZW5jeV0oaHR0cHM6Ly93d3cudG4uZ292L3RlbWEuaHRtbCkgYW5kIFtUZW5uZXNzZWUgRGVwYXJ0bWVudCBvZiBBZ3JpY3VsdHVyZV0oaHR0cHM6Ly93d3cudG4uZ292L2FncmljdWx0dXJlLmh0bWwpIGhpcmUgeW91IHRvIGhlbHAgYW5hbHl6ZSB0aGUgaW1wYWN0IG9mIGZsb29kaW5nIG9uIGNyb3BsYW5kcyBpbiBNb250Z29tZXJ5IENvdW50eS4NCg0KSW4gdGhpcyBleGVyY2lzZSB5b3Ugd2lsbDoNCg0KLSAgIERvd25sb2FkIGhhemFyZCBkYXRhIGZyb20gRkVNQQ0KLSAgIERldmVsb3AgdG9wb2dyYXBoaWNhbGx5IGRlcml2ZWQgZGF0YXNldHMgZnJvbSByYXN0ZXIgZGF0YQ0KLSAgIENhbGN1bGF0ZSBnZW9tZXRyaWMgZXh0ZW5kIG9mIHZlY3RvciBkYXRhDQotICAgQ3JlYXRlIGdyYXBocyBvZiBhdHRyaWJ1dGUgaW5mb3JtYXRpb24NCg0KU29mdHdhcmUgc3BlY2lmaWMgZGlyZWN0aW9ucyBjYW4gYmUgZm91bmQgZm9yIGVhY2ggc3RlcCBiZWxvdy4gUGxlYXNlIHN1Ym1pdCB0aGUgYW5zd2VyIHRvIHRoZSBxdWVzdGlvbnMgYW5kIHlvdXIgZmluYWwgbWFwIGJ5IHRoZSBkdWUgZGF0ZS4NCg0KIyMgU3RlcCBPbmU6IFRoZSBEYXRhDQoNClRoZSBkYXRhIHlvdSB3aWxsIGJlIHVzaW5nIGZvciB0aGlzIGV4ZXJjaXNlIGNvbWVzIGZyb20gdGhlIFtGRU1BIE5hdGlvbmFsIEZsb29kIEhhemFyZCBMYXllciBkaWdpdGFsIHZpZXdlcl0oaHR0cHM6Ly9oYXphcmRzLWZlbWEubWFwcy5hcmNnaXMuY29tL2FwcHMvd2ViYXBwdmlld2VyL2luZGV4Lmh0bWw/aWQ9OGIwYWRiNTE5OTY0NDRkNDg3OTMzOGI1NTI5YWE5Y2QpIGFuZCBpcyBjb21waWxlZCBmcm9tIHZhcmlvdXMgc291cmNlcyBpbmNsdWRpbmcgdGhlIEZsb29kIFJhdGUgSW5zdXJhbmNlIE1hcCAoRklSTSkgd2hpY2ggaXMgdGhlIHNvdXJjZSBvZiBzb21lIGZsb29kLXJlbGF0ZWQgZGVmaW5pdGlvbnMgaW4gdGhpcyBleGVyY2lzZS4NCg0KPGRldGFpbHM+DQo8c3VtbWFyeT48YmlnPlZpZXcgRGlyZWN0aW9ucyBpbiA8Yj4gW0FyY0dJUyBQcm9de3N0eWxlPSJjb2xvcjojZmY0NTAwIn0gPC9iPjwvYmlnPjwvc3VtbWFyeT4NCg0KVG8gYmVnaW4sIG9wZW4gYSBuZXcgYnJvd3NlciB3aW5kb3cvdGFiIGFuZCBnbyB0byB0aGUgW0ZFTUEgTkZITCBkaWdpdGFsIHZpZXdlcl0oaHR0cHM6Ly9oYXphcmRzLWZlbWEubWFwcy5hcmNnaXMuY29tL2FwcHMvd2ViYXBwdmlld2VyL2luZGV4Lmh0bWw/aWQ9OGIwYWRiNTE5OTY0NDRkNDg3OTMzOGI1NTI5YWE5Y2QpLiBPbiB0aGUgd2VsY29tZSBwYWdlIHlvdSB3aWxsIGJlIGdyZWV0ZWQgd2l0aCBhIHdhcm5pbmcgd2luZG93LiBDbGljayBPSyBhbmQgdGhlbiB6b29tIGludG8gY2FtcHVzLg0KDQo8cCBhbGlnbj0iY2VudGVyIj48ZGl2IGNsYXNzPSJ6b29tIj48aW1nIHNyYz0gIkltYWdlcy9mZW1hLW5maGwtaG9tZXBhZ2UucG5nIiBhbHQ9Ik5GSEwgSG9tZXBhZ2UiIHN0eWxlPSJ3aWR0aDoxMDAlIj48L2Rpdj48L3A+DQoNCldoZW4geW91IGFyZSBhYmxlIHRvIHNlZSBjYW1wdXMgYXQgdGhlIHNhbWUgem9vbSBsZXZlbCBhcyBpbiB0aGUgaW1hZ2UgYmVsb3csIGNsaWNrIG9uIHRoZSBpbWFnZSBhbmQgeW91IHdpbGwgc2VlIGEgcG9wLXVwIGJveCB3aXRoIG9wdGlvbnMgdG8gZG93bmxvYWQgdGhlIGluZm9ybWF0aW9uDQoNCjxwIGFsaWduPSJjZW50ZXIiPjxkaXYgY2xhc3M9Inpvb20iPjxpbWcgc3JjPSAiSW1hZ2VzL2ZlbWEtbmZobC1kb3dubG9hZC5wbmciIGFsdD0iTkZITCBEb3dubG9hZCIgc3R5bGU9IndpZHRoOjEwMCUiPjwvZGl2PjwvcD4NCg0KQ2xpY2sgb24gdGhlIDxiPjx1PkRvd25sb2FkPC91PiBjb3VudHkgR0lTIGRhdGE8L2I+IGxpbmsgYW5kIHNhdmUgdGhlIGZpbGUgaW4geW91ciBwcm9qZWN0IGZvbGRlciBmb3IgdGhpcyBleGVyY2lzZS4gVW56aXAgdGhlIGNvbXByZXNzZWQgZm9sZGVyIGFuZCB2aWV3IHRoZSBpbmZvcm1hdGlvbiB3aXRoaW4gdGhlIF9DYXRhbG9nIFBhbmVfLiBZb3Ugc2hvdWxkIG5vdyBzZWUgYSBudW1iZXIgb2YgcG9zc2libGUgc2hhcGVmaWxlcyBpbiB0aGUgdW56aXBwZWQgZm9sZGVyLiBUaGUgb25lIHlvdSBuZWVkIHRvIGFkZCB0byB5b3VyIG1hcCBpcyAqKlNfRkxEX0hBWl9BUi5zaHAqKi4NCg0KPHAgYWxpZ249ImNlbnRlciI+PGltZyBzcmM9ICJJbWFnZXMvYXJjZ2lzLWZsb29kLWhhemFyZC1kYXRhLmpwZyIgYWx0PSJIYXphcmQgRGF0YSBpbiBDYXRhbG9nIFBhbmUiIHN0eWxlPSJ3aWR0aDo3MCUiPjwvcD4NCg0KRXhhbWluaW5nIHRoZSBhdHRyaWJ1dGUgdGFibGUgZm9yIHRoZSBkYXRhc2V0IHlvdSB3aWxsIHNlZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgdmFyaWFibGVzOyBzb21lIG9mIHRoZW0gd2l0aG91dCBkYXRhIG9yIHdpdGggYSB2YWx1ZSBvZiAtOTk5OSB3aGljaCBpcyB1c2VkIGJ5IGEgbnVtYmVyIG9mIGRpZmZlcmVudCBkYXRhIGZvcm1hdHMgdG8gbWVhbiBubyBkYXRhLiBUaGUgdHdvIHZhcmlhYmxlcyB5b3Ugd2lsbCB1c2UgZm9yIHRoaXMgZXhlcmNpc2UgaXMgdGhlICoqRkxEX1pPTkUqKiBhbmQgKipaT05FX1NVQlRZKiouIE5vdGljZSB0aGF0IHRoZSBGTERfWk9ORSBmaWVsZCBpcyBwb3B1bGF0ZWQgd2l0aCAiWCIsICJBIiwgYW5kICJBRSIgdmFsdWVzIHdoaWxlIHRoZSBaT05FX1NVQlRZIGhhcyB0aHJlZSB2YWx1ZXMgIjAuMiBQQ1QgQW5udWFsIENoYW5jZSBGbG9vZCBIYXphcmQiLCAiQXJlYSBvZiBNaW5pbWFsIEZsb29kIEhhemFyZCIsIGFuZCAiRmxvb2R3YXkiLiBUaGUgZm9sbG93aW5nIGlzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgZWFjaDoNCg0KLSAqKkEqKjogYSBoaWdoLXJpc2sgZmxvb2Qgem9uZSB0aGF0IGhhcyBhIG9uZSBwZXJjZW50IGNoYW5jZSBvZiBmbG9vZGluZyBlYWNoIHllYXIuIE92ZXIgdGhlIGNvdXJzZSBvZiBhIDMwLXllYXIgbW9ydGdhZ2UsIHRoZSBsaWtlbGlob29kIG9mIGEgZmxvb2QgaXMgMjYgcGVyY2VudC4gVGhlcmUgYXJlIG5vIGRldGFpbGVkIGFuYWx5c2VzIG9mIGFyZWFzIGluIEZsb29kIFpvbmUgQSwgc28gdGhlcmUgYXJlIG5vIGRlcHRocyBvciBiYXNlIGZsb29kIGVsZXZhdGlvbnMgaW4gdGhpcyB6b25lLg0KLSAqKkFFKio6IGEgaGlnaC1yaXNrIGZsb29kIHpvbmUgdGhhdCBwcmVzZW50IGEgb25lIHBlcmNlbnQgYW5udWFsIGNoYW5jZSBvZiBmbG9vZGluZyBhbmQgYSAyNiUgY2hhbmNlIG92ZXIgdGhlIGxpZmUgb2YgYSAzMC15ZWFyIG1vcnRnYWdlLiBUaGVzZSByZWdpb25zIGFyZSBjbGVhcmx5IGRlZmluZWQgaW4gRmxvb2QgSW5zdXJhbmNlIFJhdGUgTWFwcyBhbmQgYXJlIHBhaXJlZCB3aXRoIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGJhc2UgZmxvb2QgZWxldmF0aW9ucy4NCi0gKipYKio6IGFyZWEgZGV0ZXJtaW5lZCB0byBiZSBvdXRzaWRlIHRoZSA1MDAteWVhciBmbG9vZCBhbmQgcHJvdGVjdGVkIGJ5IGxldmVlIGZyb20gMTAwLSB5ZWFyIGZsb29kLg0KLSAqKjAuMiBQQ1QgQW5udWFsIENoYW5jZSBGbG9vZCBIYXphcmQqKjogYXJlYSB3aXRoIGEgbW9kZXJhdGUgY2hhbmNlIG9mIGZsb29kIGVxdWFsIHRvIDAuMiBwZXJjZW50IGFubnVhbGx5LiANCi0gKipBcmVhIG9mIE1pbmltYWwgRmxvb2QgSGF6YXJkKio6IGFyZWEgZGV0ZXJtaW5lZCB0byBiZSBvdXRzaWRlIHRoZSA1MDAteWVhciBmbG9vZCBhbmQgcHJvdGVjdGVkIGJ5IGxldmVlIGZyb20gMTAwLSB5ZWFyIGZsb29kLg0KLSAqKkZsb29kd2F5Kio6IHRoZSBjaGFubmVsIG9mIGEgcml2ZXIgb3Igb3RoZXIgd2F0ZXJjb3Vyc2UgYW5kIHRoZSBhZGphY2VudCBsYW5kIGFyZWFzIHRoYXQgbXVzdCBiZSByZXNlcnZlZCBpbiBvcmRlciB0byBkaXNjaGFyZ2UgdGhlIGJhc2UgZmxvb2Qgd2l0aG91dCBjdW11bGF0aXZlbHkgaW5jcmVhc2luZyB0aGUgd2F0ZXIgc3VyZmFjZSBlbGV2YXRpb24gbW9yZSB0aGFuIGEgZGVzaWduYXRlZCBoZWlnaHQuDQoNCkZvciB0aGlzIGFuYWx5c2lzIHlvdSB3aWxsIGZvY3VzIG9uIEEsIEFFLCBhbmQgMC4yIFBDVCBBbm51YWwgQ2hhbmNlIEZsb29kIEhhemFyZCB6b25lcy4gV2hpbGUgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIHdheXMgdG8gc3Vic2V0IHRoZSBkYXRhLCBpbiB0aGlzIGV4ZXJjaXNlIHlvdSB3aWxsIHNpbXBseSByaWdodC1jbGljayBvbiB0aGUgZGF0YXNldCBhbmQgc2VsZWN0IF9EYXRhID4gRXhwb3J0IEZlYXR1cmVzXy4gSW4gdGhlIHJlc3VsdGluZyB3aW5kb3cgc2VsZWN0IHRoZSBmbG9vZCBoYXphcmQgZGF0YSBhcyB0aGUgSW5wdXQgRmVhdHVyZSwgdXNlIHRoZSBicm93c2UgYnV0dG9uIHRvIHNlbGVjdCB0aGUgb3V0cHV0IGxvY2F0aW9uIGluIHlvdXIgcHJvamVjdCBmb2xkZXIsIGFuZCBnaXZlIHRoZSBcKi5zaHAgZmlsZSBhIG5ldyBuYW1lLiBOZXh0LCBjbGljayB0aGUgbmV3IGV4cHJlc3Npb24gYnV0dG9uIGFuZCB1c2UgdGhlIGZvbGxvd2luZyBTUUw6DQoNCmBXaGVyZSBGTERfWk9ORSBpcyBlcXVhbCB0byBBYA0KDQpUaGVuIGNsaWNrIEFkZCBDbGF1c2UuLi4NCg0KYE9yIFdoZXJlIEZMRF9aT05FIGlzIGVxdWFsIHRvIEFFYA0KDQpUaGVuIGNsaWNrIEFkZCBDbGF1c2UuLi4NCg0KYE9yIFdoZXJlIFpPTkVfU1VCVFkgaXMgZXF1YWwgdG8gMC4yIFBDVCBBbm51YWwgQ2hhbmNlIEZsb29kIEhhemFyZGANCg0KQW5kIGZpbmFsbHkgY2xpY2sgT0suIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgZGF0YXNldCB0aGF0IGluY2x1ZGVzIG9ubHkgdGhlIHNlbGVjdGVkIHZhcmlhYmxlcy4NCg0KPHAgYWxpZ249ImNlbnRlciI+PGRpdiBjbGFzcz0iem9vbSI+PGltZyBzcmM9ICJJbWFnZXMvYXJjZ2lzLWZsb29kLXpvbmUtZXhwcmVzc2lvbi5wbmciIGFsdD0iU2VsZWN0aW5nIG9ubHkgdGhlIGZsb29kIHpvbmUgaW5mb3JtYXRpb24gZnJvbSBhYm92ZSIgc3R5bGU9IndpZHRoOjEwMCUiPjwvZGl2PjwvcD4NCg0KTmV4dCwgb3BlbiBhIG5ldyB0YWIgaW4geW91ciBicm93c2VyIHRvIGRvd25sb2FkIHRoZSByZW1haW5pbmcgZGF0YSBmb3IgdGhpcyBleGVyY2lzZSBmcm9tIHRoZSBleGVyY2lzZSBbKipHaXRIdWIgUGFnZSoqXShodHRwczovL2dpdGh1Yi5jb20vY2hyaXNtZ2VudHJ5L0dJUzEtRXhlcmNpc2UtOC90cmVlL21haW4vRGF0YSAiQ2xpY2sgSGVyZSIpLiBUaGUgKiptb250Y29fZGVtX2ZlZXQudGlmKiogaXMgdGhlIGRpZ2l0YWwgZWxldmF0aW9uIG1vZGVsIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSBjb250b3VycyBhbmQgdGhlICoqbW9udGNvX2Nyb3BfbGFuZCoqIHppcCBjb250YWlucyBhIHNoYXBlZmlsZSBvZiBzZWxlY3RlZCBjcm9wbGFuZCBkYXRhIGZvciBNb250Z29tZXJ5IENvdW50eSBmcm9tIHRoZSBfVVNEQSBOYXRpb25hbCBBZ3JpY3VsdHVyZSBTdGF0aXN0aWNzIFNlcnZpY2VfIFtDcm9wU2NhcGVdKGh0dHBzOi8vbmFzc2dlb2RhdGEuZ211LmVkdS9Dcm9wU2NhcGUvKSBXZWJzaXRlLiBXaXRoIHRoaXMgZGF0YSBkb3dubG9hZGVkIHRvIHlvdXIgcHJvamVjdCBmb2xkZXIsIGFkZCB0aGVtIHRvIHlvdXIgbWFwIHZpZXcuIE9uIHRoZSBleGFtcGxlIGJlbG93IHRoZSBuYW1lcyBhbmQgc3ltYm9sb2d5IGZvciB0aGUgZmxvb2Qgem9uZXMgd2VyZSBjaGFuZ2VkIHRvIHJlZmxlY3QgdGhlaXIgY2F0ZWdvcnkgZGVzY3JpcHRpb24uDQoNCjxwIGFsaWduPSJjZW50ZXIiPjxkaXYgY2xhc3M9Inpvb20iPjxpbWcgc3JjPSAiSW1hZ2VzL2FyY2dpcy1hbGwtZGF0YS1zdGVwMS5wbmciIGFsdD0iRGF0YSBFeGFtcGxlIiBzdHlsZT0id2lkdGg6MTAwJSI+PC9kaXY+PC9wPg0KDQo8YmlnPjxiPlF1ZXN0aW9uIE5vLiAxPC9iPjwvYmlnPg0KPGJsb2NrcXVvdGU+DQpfV2hhdCBpcyB0aGUgcmFuZ2Ugb2YgdmFsdWVzIGZvciB0aGUgREVNIG9mIE1vbnRnb21lcnkgQ291bnR5P18NCjwvYmxvY2txdW90ZT4NCg0KPC9kZXRhaWxzPg0KPGhyPjwvaHI+DQoNCjxkZXRhaWxzPg0KPHN1bW1hcnk+PGJpZz5WaWV3IGRpcmVjdGlvbnMgaW4gPGI+IFtRR0lTXXtzdHlsZT0iY29sb3I6ICMwMDY0MDAifSA8L2I+PC9iaWc+PC9zdW1tYXJ5Pg0KDQpUbyBiZWdpbiwgb3BlbiBhIG5ldyBicm93c2VyIHdpbmRvdy90YWIgYW5kIGdvIHRvIHRoZSBbRkVNQSBORkhMIGRpZ2l0YWwgdmlld2VyXShodHRwczovL2hhemFyZHMtZmVtYS5tYXBzLmFyY2dpcy5jb20vYXBwcy93ZWJhcHB2aWV3ZXIvaW5kZXguaHRtbD9pZD04YjBhZGI1MTk5NjQ0NGQ0ODc5MzM4YjU1MjlhYTljZCkuIE9uIHRoZSB3ZWxjb21lIHBhZ2UgeW91IHdpbGwgYmUgZ3JlZXRlZCB3aXRoIGEgd2FybmluZyB3aW5kb3cuIENsaWNrIE9LIGFuZCB0aGVuIHpvb20gaW50byBjYW1wdXMuDQoNCjxwIGFsaWduPSJjZW50ZXIiPjxkaXYgY2xhc3M9Inpvb20iPjxpbWcgc3JjPSAiSW1hZ2VzL2ZlbWEtbmZobC1ob21lcGFnZS5wbmciIGFsdD0iTkZITCBIb21lcGFnZSIgc3R5bGU9IndpZHRoOjEwMCUiPjwvZGl2PjwvcD4NCg0KV2hlbiB5b3UgYXJlIGFibGUgdG8gc2VlIGNhbXB1cyBhdCB0aGUgc2FtZSB6b29tIGxldmVsIGFzIGluIHRoZSBpbWFnZSBiZWxvdywgY2xpY2sgb24gdGhlIGltYWdlIGFuZCB5b3Ugd2lsbCBzZWUgYSBwb3AtdXAgYm94IHdpdGggb3B0aW9ucyB0byBkb3dubG9hZCB0aGUgaW5mb3JtYXRpb24NCg0KPHAgYWxpZ249ImNlbnRlciI+PGRpdiBjbGFzcz0iem9vbSI+PGltZyBzcmM9ICJJbWFnZXMvZmVtYS1uZmhsLWRvd25sb2FkLnBuZyIgYWx0PSJORkhMIERvd25sb2FkIiBzdHlsZT0id2lkdGg6MTAwJSI+PC9kaXY+PC9wPg0KDQpDbGljayBvbiB0aGUgPGI+PHU+RG93bmxvYWQ8L3U+IGNvdW50eSBHSVMgZGF0YTwvYj4gbGluayBhbmQgc2F2ZSB0aGUgZmlsZSBpbiB5b3VyIHByb2plY3QgZm9sZGVyIGZvciB0aGlzIGV4ZXJjaXNlLiBVbnppcCB0aGUgY29tcHJlc3NlZCBmb2xkZXIgYW5kIHZpZXcgdGhlIGluZm9ybWF0aW9uIHdpdGhpbiB0aGUgX0NhdGFsb2cgUGFuZV8uIFlvdSBzaG91bGQgbm93IHNlZSBhIG51bWJlciBvZiBwb3NzaWJsZSBzaGFwZWZpbGVzIGluIHRoZSB1bnppcHBlZCBmb2xkZXIuIFRoZSBvbmUgeW91IG5lZWQgdG8gYWRkIHRvIHlvdXIgbWFwIGlzICoqU19GTERfSEFaX0FSLnNocCoqLg0KDQo8cCBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0gIkltYWdlcy9xZ2lzLWZsb29kLWhhemFyZC1kYXRhLmpwZyIgYWx0PSJIYXphcmQgRGF0YSBpbiBDYXRhbG9nIFBhbmUiIHN0eWxlPSJ3aWR0aDo3MCUiPjwvcD4NCg0KRXhhbWluaW5nIHRoZSBhdHRyaWJ1dGUgdGFibGUgZm9yIHRoZSBkYXRhc2V0IHlvdSB3aWxsIHNlZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgdmFyaWFibGVzOyBzb21lIG9mIHRoZW0gd2l0aG91dCBkYXRhIG9yIHdpdGggYSB2YWx1ZSBvZiAtOTk5OSB3aGljaCBpcyB1c2VkIGJ5IGEgbnVtYmVyIG9mIGRpZmZlcmVudCBkYXRhIGZvcm1hdHMgdG8gbWVhbiBubyBkYXRhLiBUaGUgdHdvIHZhcmlhYmxlcyB5b3Ugd2lsbCB1c2UgZm9yIHRoaXMgZXhlcmNpc2UgaXMgdGhlICoqRkxEX1pPTkUqKiBhbmQgKipaT05FX1NVQlRZKiouIE5vdGljZSB0aGF0IHRoZSBGTERfWk9ORSBmaWVsZCBpcyBwb3B1bGF0ZWQgd2l0aCAiWCIsICJBIiwgYW5kICJBRSIgdmFsdWVzIHdoaWxlIHRoZSBaT05FX1NVQlRZIGhhcyB0aHJlZSB2YWx1ZXMgIjAuMiBQQ1QgQW5udWFsIENoYW5jZSBGbG9vZCBIYXphcmQiLCAiQXJlYSBvZiBNaW5pbWFsIEZsb29kIEhhemFyZCIsIGFuZCAiRmxvb2R3YXkiLiBUaGUgZm9sbG93aW5nIGlzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgZWFjaDoNCg0KLSAqKkEqKjogYSBoaWdoLXJpc2sgZmxvb2Qgem9uZSB0aGF0IGhhcyBhIG9uZSBwZXJjZW50IGNoYW5jZSBvZiBmbG9vZGluZyBlYWNoIHllYXIuIE92ZXIgdGhlIGNvdXJzZSBvZiBhIDMwLXllYXIgbW9ydGdhZ2UsIHRoZSBsaWtlbGlob29kIG9mIGEgZmxvb2QgaXMgMjYgcGVyY2VudC4gVGhlcmUgYXJlIG5vIGRldGFpbGVkIGFuYWx5c2VzIG9mIGFyZWFzIGluIEZsb29kIFpvbmUgQSwgc28gdGhlcmUgYXJlIG5vIGRlcHRocyBvciBiYXNlIGZsb29kIGVsZXZhdGlvbnMgaW4gdGhpcyB6b25lLg0KLSAqKkFFKio6IGEgaGlnaC1yaXNrIGZsb29kIHpvbmUgdGhhdCBwcmVzZW50IGEgb25lIHBlcmNlbnQgYW5udWFsIGNoYW5jZSBvZiBmbG9vZGluZyBhbmQgYSAyNiUgY2hhbmNlIG92ZXIgdGhlIGxpZmUgb2YgYSAzMC15ZWFyIG1vcnRnYWdlLiBUaGVzZSByZWdpb25zIGFyZSBjbGVhcmx5IGRlZmluZWQgaW4gRmxvb2QgSW5zdXJhbmNlIFJhdGUgTWFwcyBhbmQgYXJlIHBhaXJlZCB3aXRoIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGJhc2UgZmxvb2QgZWxldmF0aW9ucy4NCi0gKipYKio6IGFyZWEgZGV0ZXJtaW5lZCB0byBiZSBvdXRzaWRlIHRoZSA1MDAteWVhciBmbG9vZCBhbmQgcHJvdGVjdGVkIGJ5IGxldmVlIGZyb20gMTAwLSB5ZWFyIGZsb29kLg0KLSAqKjAuMiBQQ1QgQW5udWFsIENoYW5jZSBGbG9vZCBIYXphcmQqKjogYXJlYSB3aXRoIGEgbW9kZXJhdGUgY2hhbmNlIG9mIGZsb29kIGVxdWFsIHRvIDAuMiBwZXJjZW50IGFubnVhbGx5LiANCi0gKipBcmVhIG9mIE1pbmltYWwgRmxvb2QgSGF6YXJkKio6IGFyZWEgZGV0ZXJtaW5lZCB0byBiZSBvdXRzaWRlIHRoZSA1MDAteWVhciBmbG9vZCBhbmQgcHJvdGVjdGVkIGJ5IGxldmVlIGZyb20gMTAwLSB5ZWFyIGZsb29kLg0KLSAqKkZsb29kd2F5Kio6IHRoZSBjaGFubmVsIG9mIGEgcml2ZXIgb3Igb3RoZXIgd2F0ZXJjb3Vyc2UgYW5kIHRoZSBhZGphY2VudCBsYW5kIGFyZWFzIHRoYXQgbXVzdCBiZSByZXNlcnZlZCBpbiBvcmRlciB0byBkaXNjaGFyZ2UgdGhlIGJhc2UgZmxvb2Qgd2l0aG91dCBjdW11bGF0aXZlbHkgaW5jcmVhc2luZyB0aGUgd2F0ZXIgc3VyZmFjZSBlbGV2YXRpb24gbW9yZSB0aGFuIGEgZGVzaWduYXRlZCBoZWlnaHQuDQoNCkZvciB0aGlzIGFuYWx5c2lzIHlvdSB3aWxsIGZvY3VzIG9uIEEsIEFFLCBhbmQgMC4yIFBDVCBBbm51YWwgQ2hhbmNlIEZsb29kIEhhemFyZCB6b25lcy4NCg0KPGJpZz48Yj5RdWVzdGlvbiBOby4gMTwvYj48L2JpZz4NCjxibG9ja3F1b3RlPg0KX1doYXQgaXMgdGhlIHJhbmdlIG9mIHZhbHVlcyBmb3IgdGhlIERFTSBvZiBNb250Z29tZXJ5IENvdW50eT9fDQo8L2Jsb2NrcXVvdGU+DQoNCjwvZGV0YWlscz4NCjxocj48L2hyPg0KDQo8ZGV0YWlscz48c3VtbWFyeT48YmlnPlZpZXcgZGlyZWN0aW9ucyBpbiA8Yj4gW1Jde3N0eWxlPSJjb2xvcjogIzY0OTVFRCJ9IDwvYj48L3NwYW4+PC9iaWc+PC9zdW1tYXJ5Pg0KQmVmb3JlIHlvdSBiZWdpbiwgeW91IHdpbGwgbmVlZCB0byBvcGVuIHRoZSBbRXgyIENvbGFiIE5vdGVib29rXShodHRwczovL2dpdGh1Yi5jb20vY2hyaXNtZ2VudHJ5L0dJUzEtRXhlcmNpc2UtOC9ibG9iL21haW4vR0lTMV9FWDguaXB5bmIpIGFuZCBpbnNlcnQgKip0b2NvbGFiKiogYWZ0ZXIgX2dpdGh1Yl8gaW4gdGhlIFVSTCB0byBvcGVuIGluIHRoZSBfQ29sYWIgRW52aXJvbm1lbnRfLiBBcyB5b3UgaGF2ZSBzZWVuIGJlZm9yZSwgUiByZXF1aXJlcyB2YXJpb3VzIHBhY2thZ2VzIHRvIGNvbXBsZXRlIGNlcnRhaW4gYW5hbHlzZXMuIEluIHRoaXMgZXhlcmNpc2UgeW91IHdpbGwgYmUgdXNpbmcgKip0aWR5dmVyc2UsIE9wZW5TdHJlZXRNYXBzLCBnZ2ZvcnRpZnksIG1hcHRvb2xzLCBhbmQgcmdlb3MqKi4gVG8gaW5zdGFsbCBhbmQgbG9hZCB0aGUgcGFja2FnZXMgd2Ugd2lsbCB1c2UgdGhlIGZvbGxvd2luZyBzY3JpcHQ6DQoNCkJsYWguLi5ibGFoLi4uYmxhaC4uLg0KDQo8YmlnPjxiPlF1ZXN0aW9uIE5vLiAxPC9iPjwvYmlnPg0KPGJsb2NrcXVvdGU+DQpfV2hhdCBpcyB0aGUgcmFuZ2Ugb2YgdmFsdWVzIGZvciB0aGUgREVNIG9mIE1vbnRnb21lcnkgQ291bnR5P18NCjwvYmxvY2txdW90ZT4NCg0KPC9kZXRhaWxzPg0KDQojIyBTdGVwIFR3bzogVGhlIEFuYWx5c2VzDQoNCkluIG9yZGVyIHRvIGRldGVybWluZSB0aGUgZWxldmF0aW9ucyB0aGF0IGFyZSBtb3N0IHN1c2NlcHRpYmxlIHRvIGZsb29kaW5nIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGNvbnRvdXJzIGZyb20gdGhlIERFTS4gDQoNCjxkZXRhaWxzPg0KPHN1bW1hcnk+PGJpZz5WaWV3IERpcmVjdGlvbnMgaW4gPGI+IFtBcmNHSVMgUHJvXXtzdHlsZT0iY29sb3I6I2ZmNDUwMCJ9IDwvYj48L2JpZz48L3N1bW1hcnk+DQoNCkJ5IGVpdGhlciBzZWFyY2hpbmcgdGhyb3VnaCB0aGUgdG9vbHMgZHJvcC1kb3duIG1lbnUgb3IgYnkgc2VhcmNoaW5nIGZvciBpdCBpbiB0aGUgR2VvcHJvY2Vzc2luZyBUb29scywgb3BlbiB0aGUgYENvbnRvdXJgIHRvb2wsIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzLCBhbmQgY2xpY2sgUnVuOg0KDQotIElucHV0IHJhc3RlciA9IG1vbnRjb19kZW1fZmVldC50aWYNCi0gT3V0cHV0IGZlYXR1cmUgY2xhc3MgPSBuYXZpZ2F0ZSB0byB5b3VyIHByb2plY3QgZm9sZGVyIGFuZCBzYXZlIGFzIGEgc2hhcGVmaWxlIChcKi5zaHApDQotIENvdW50b3VyIGludGVydmFsID0gMjANCi0gQmFzZSBjb250b3VyID0gMTAwDQotIFogZmFjdG9yID0gMQ0KLSBDb250b3VyIHR5cGUgPSBDb250b3VyDQotIE1heGltdW0gdmVydGljaWVzIHBlciBmZWF0dXJlID0gbGVhdmUgYmxhbmsNCg0KPHAgYWxpZ249ImNlbnRlciI+PGRpdiBjbGFzcz0iem9vbSI+PGltZyBzcmM9ICJJbWFnZXMvYXJjZ2lzLWNyZWF0ZS1jb250b3Vycy5wbmciIGFsdD0iTkZITCBEb3dubG9hZCIgc3R5bGU9IndpZHRoOjEwMCUiPjwvZGl2PjwvcD4NCg0KWW91IHdpbGwgbm93IGhhdmUgY29udG91cnMgYWRkZWQgdG8geW91ciBtYXAgdmlldy4gVGhlIGNvbnRvdXJzIHdpbGwgZW5jb21wYXNzIHRoZSBlbnRpcmUgY291bnR5IGJlY2F1c2UgdGhleSB3ZXJlIGNyZWF0ZWQgZnJvbSB0aGUgY291bnR5IERFTS4NCg0KPHAgYWxpZ249ImNlbnRlciI+PGRpdiBjbGFzcz0iem9vbSI+PGltZyBzcmM9ICJJbWFnZXMvYXJjZ2lzLWNvbnRvdXJzLnBuZyIgYWx0PSJORkhMIERvd25sb2FkIiBzdHlsZT0id2lkdGg6MTAwJSI+PC9kaXY+PC9wPg0KDQpXaGlsZSB0aGlzIGluZm9ybWF0aW9uIGNvdWxkIGJlIGJlbmVmaWNpYWwgZm9yIG90aGVyIGFuYWx5c2VzLCBmb3IgdGhpcyBleGVyY2lzZSB5b3Ugc2hvdWxkIGNsaXAgdGhlIGNvbnRvdXIgYmFzZWQgb24gdGhlIGZsb29kIHpvbmUgZGF0YXNldCB5b3UgY3JlYXRlZCBpbiBbU3RlcCAxXShodHRwczovL2NocmlzbWdlbnRyeS5naXRodWIuaW8vR0lTMS1FeGVyY2lzZS04LyMxMV9TdGVwX09uZTpfVGhlX0RhdGEpLiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IGRhdGFzZXQgdGhhdCBpbmNsdWRlcyBvbmx5IHRoZSBlbGV2YXRpb25zIHByb25lIHRvIGZsb29kaW5nIGlzc3Vlcy4NCg0KRmluYWxseSwgYmVjYXVzZSB0aGlzIGV4ZXJjaXNlIGZvY3VzZXMgb24gY3JvcGxhbmRzIHRoYXQgYXJlIHN1c2NlcHRpYmxlIHRvIGZsb29kaW5nLCBjbGlwIHRoZSBjcm9wbGFuZCBkYXRhc2V0IHRvIHRoZSBzZWxlY3QgZmxvb2Qgem9uZXMgbGF5ZXIgYXMgd2VsbC4gVGhlbiB5b3UgY2FuIHVzZSB0aGUgc3ltYm9sb2d5IHRvb2wgdG8gZ2l2ZSB0aGUgZGF0YSBfdW5pcXVlIHZhbHVlc18gYnkgX2NsYXNzX25hbWVfLg0KDQo8cCBhbGlnbj0iY2VudGVyIj48ZGl2IGNsYXNzPSJ6b29tIj48aW1nIHNyYz0gIkltYWdlcy9hcmNnaXMtYWxsLWRhdGEtc3RlcDIucG5nIiBhbHQ9IkRhdGEgRXhhbXBsZSIgc3R5bGU9IndpZHRoOjEwMCUiPjwvZGl2PjwvcD4NCg0KPGJpZz48Yj5RdWVzdGlvbiBOby4gMjwvYj48L2JpZz4NCjxibG9ja3F1b3RlPg0KX1doYXQgaXMgdGhlIHJhbmdlIG9mIGVsZXZhdGlvbnMgaW4gZmxvb2QgcHJvbmUgYXJlYXM/Xw0KPC9ibG9ja3F1b3RlPg0KDQo8L2RldGFpbHM+DQo8aHI+PC9ocj4NCg0KPGRldGFpbHM+DQo8c3VtbWFyeT48YmlnPlZpZXcgRGlyZWN0aW9ucyBpbiA8Yj4gW1FHSVNde3N0eWxlPSJjb2xvcjojMDA2NDAwIn0gPC9iPjwvYmlnPjwvc3VtbWFyeT4NCg0KQmxhaC4uLmJsYWguLi5ibGFoLi4uDQoNCjxiaWc+PGI+UXVlc3Rpb24gTm8uIDI8L2I+PC9iaWc+DQo8YmxvY2txdW90ZT4NCl9JbnNlcnQgVGV4dCBIZXJlXw0KPC9ibG9ja3F1b3RlPg0KDQo8L2RldGFpbHM+DQo8aHI+PC9ocj4NCg0KPGRldGFpbHM+DQo8c3VtbWFyeT48YmlnPlZpZXcgRGlyZWN0aW9ucyBpbiA8Yj4gW1Jde3N0eWxlPSJjb2xvcjojNjQ5NUVEIn0gPC9iPjwvYmlnPjwvc3VtbWFyeT4NCg0KQmxhaC4uLmJsYWguLi5ibGFoLi4uDQoNCjxiaWc+PGI+UXVlc3Rpb24gTm8uIDI8L2I+PC9iaWc+DQo8YmxvY2txdW90ZT4NCl9JbnNlcnQgVGV4dCBIZXJlXw0KPC9ibG9ja3F1b3RlPg0KDQo8L2RldGFpbHM+DQoNCiMjIFN0ZXAgVGhyZWU6IFRoZSBWaXN1YWxpemF0aW9uDQoNCkluIHRoaXMgc3RlcCB5b3Ugd2lsbCBjcmVhdGUgbGFuZHNjYXBlIHZpZXdzIHRoYXQgbWltaWMgdGhyZWUgZGltZW5zaW9uYWwgc3VyZmFjZXMgYW5kIHByb3ZpZGUgYSBjdXN0b20gY29sb3IgcGFsZXR0ZSBmb3IgdGhlIGNyb3BsYW5kcyBiYXNlZCBvbiBkYXRhIGZyb20gdGhlIFN0YXRlIG9mIFRlbm5lc3NlZSwgRGVwYXJ0bWVudCBvZiBBZ3JpY3VsdHVyZS4NCg0KPGRldGFpbHM+PHN1bW1hcnk+PGJpZz5WaWV3IGRpcmVjdGlvbnMgaW4gPGI+IFtBcmNHSVMgUHJvXXtzdHlsZT0iY29sb3I6I2ZmNDUwMCJ9IDwvYj48L3NwYW4+PC9iaWc+PC9zdW1tYXJ5Pg0KDQpCbGFoLi4uYmxhaC4uLmJsYWguLi4NCg0KSElMTFNIQURFDQoNCkNyb3BTY2FwZSBjb2xvcg0KDQo8YmlnPjxiPlF1ZXN0aW9uIE5vLiAzPC9iPjwvYmlnPg0KPGJsb2NrcXVvdGU+DQpfSW5zZXJ0IFRleHQgSGVyZV8NCjwvYmxvY2txdW90ZT4NCg0KPC9kZXRhaWxzPg0KPGhyPjwvaHI+DQoNCjxkZXRhaWxzPjxzdW1tYXJ5PjxiaWc+VmlldyBkaXJlY3Rpb25zIGluIDxiPiBbUUdJU117c3R5bGU9ImNvbG9yOiMwMDY0MDAifSA8L2I+PC9zcGFuPjwvYmlnPjwvc3VtbWFyeT4NCg0KQmxhaC4uLmJsYWguLi5ibGFoLi4uDQoNCjxiaWc+PGI+UXVlc3Rpb24gTm8uIDM8L2I+PC9iaWc+DQo8YmxvY2txdW90ZT4NCl9JbnNlcnQgVGV4dCBIZXJlXw0KPC9ibG9ja3F1b3RlPg0KDQo8L2RldGFpbHM+DQo8aHI+PC9ocj4NCg0KPGRldGFpbHM+PHN1bW1hcnk+PGJpZz5WaWV3IGRpcmVjdGlvbnMgaW4gPGI+IFtSXXtzdHlsZT0iY29sb3I6IzY0OTVFRCJ9IDwvYj48L3NwYW4+PC9iaWc+PC9zdW1tYXJ5Pg0KDQpCbGFoLi4uYmxhaC4uLmJsYWguLi4NCg0KPGJpZz48Yj5RdWVzdGlvbiBOby4gMzwvYj48L2JpZz4NCjxibG9ja3F1b3RlPg0KX0luc2VydCBUZXh0IEhlcmVfDQo8L2Jsb2NrcXVvdGU+DQoNCjwvZGV0YWlscz4NCg0KIyMgU3RlcCBGb3VyOiBUaGUgUHJvcG9zYWwNCg0KQmxhaC4uLmJsYWguLi5ibGFoLi4uDQoNCjxkZXRhaWxzPjxzdW1tYXJ5PjxiaWc+VmlldyBkaXJlY3Rpb25zIGluIDxiPiBbQXJjR0lTIFByb117c3R5bGU9ImNvbG9yOiNmZjQ1MDAifSA8L2I+PC9zcGFuPjwvYmlnPjwvc3VtbWFyeT4NCg0KQmxhaC4uLmJsYWguLi5ibGFoLi4uDQoNCjxiaWc+PGI+UXVlc3Rpb24gTm8uIDQ8L2I+PC9iaWc+DQo8YmxvY2txdW90ZT4NCl9JbnNlcnQgVGV4dCBIZXJlXw0KPC9ibG9ja3F1b3RlPg0KDQo8L2RldGFpbHM+DQo8aHI+PC9ocj4NCg0KPGRldGFpbHM+PHN1bW1hcnk+PGJpZz5WaWV3IGRpcmVjdGlvbnMgaW4gPGI+IFtRR0lTXXtzdHlsZT0iY29sb3I6IzAwNjQwMCJ9IDwvYj48L3NwYW4+PC9iaWc+PC9zdW1tYXJ5Pg0KDQpCbGFoLi4uYmxhaC4uLmJsYWguLi4NCg0KPGJpZz48Yj5RdWVzdGlvbiBOby4gNDwvYj48L2JpZz4NCjxibG9ja3F1b3RlPg0KX0luc2VydCBUZXh0IEhlcmVfDQo8L2Jsb2NrcXVvdGU+DQoNCjwvZGV0YWlscz4NCjxocj48L2hyPg0KDQo8ZGV0YWlscz48c3VtbWFyeT48YmlnPlZpZXcgZGlyZWN0aW9ucyBpbiA8Yj4gW1Jde3N0eWxlPSJjb2xvcjojNjQ5NUVEIn0gPC9iPjwvc3Bhbj48L2JpZz48L3N1bW1hcnk+DQoNCkJsYWguLi5ibGFoLi4uYmxhaC4uLg0KDQo8YmlnPjxiPlF1ZXN0aW9uIE5vLiA0PC9iPjwvYmlnPg0KPGJsb2NrcXVvdGU+DQpfSW5zZXJ0IFRleHQgSGVyZV8NCjwvYmxvY2txdW90ZT4NCg0KPC9kZXRhaWxzPg0KDQojIFRoZSBXcml0ZS1VcA0KDQpXaGVuIGNvbXBsZXRpbmcgdGhlIHJlcG9ydCBmb3IgRkVNQSBwbGVhc2UgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOg0KDQotIERlc2NyaWJlIHRoZSBlbGV2YXRpb24gcmFuZ2UgdGhhdCBjcm9wcyBhcmUgbW9zdCBpbXBhY3RlZCBieSBmbG9vZCB3YXRlcnMgaW4gTW9udGdvbWVyeSBDb3VudHkuDQotIFdoYXQgYXJlIHRoZSB0b3AgZml2ZSAoNSkgY3JvcHMgbW9zdCBpbXBhY3RlZCBieSBmbG9vZCB3YXRlcnMgYnkgYXJlYSBhbmQgd2hhdCBhcmUgdGhlIGluZGl2aWR1YWwgYXJlYXMgY292ZXJlZCBieSB0aGVzZSBjcm9wcz8NCi0gT2YgdGhlIGdyYWluIGNyb3BzIGluIHRoZSBxdWVzdGlvbiBhYm92ZSB0aGF0IGFyZSBsaXN0ZWQgW2hlcmVdKGh0dHBzOi8vd3d3LmJsb29tYmVyZy5jb20vbWFya2V0cy9jb21tb2RpdGllcy9mdXR1cmVzL2FncmljdWx0dXJlICJDbGljayBIZXJlIiksIHdoYXQgd291bGQgYmUgdGhlIGZpbmFuY2lhbCBsb3NzIGlmIGFsbCB0aG9zZSBjcm9wcyB3ZXJlIGxvc3QgdG8gZmxvb2Q/DQogIC0gQXNzdW1pbmcgMTcwIGJ1c2hlbHMgcGVyIGFjcmUgb2YgY29ybiBhbmQgNTAgYnVzaGVscyBwZXIgYWNyZSBmb3Igb3RoZXIgZ3JhaW5zLg0KDQpXaGVuIGNvbXBsZXRlLCBzZW5kIGEgbGluayB0byB5b3VyIF9Db2xhYiBOb3RlYm9va18gb3Igd29yZCBkb2N1bWVudCB3aXRoIGFuc3dlcnMgdG8gUXVlc3Rpb25zIDEtNCBhbmQgeW91ciBjb21wbGV0ZWQgbWFwIHZpYSBlbWFpbC4=